home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d14
/
dde_lib.arc
/
SESSUTIL.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-25
|
7KB
|
285 lines
/* **********************************************************
sessutil.c - Session DDE client for variable maintenance
Placed in public domain by Horizon Technologies Inc. 1990
***revision history***
1 SESSUTIL.C 29-Jan-90,13:35:12,`JMH' Base version
2 SESSUTIL.C 28-Feb-90,13:52:26,`JMH' Version as of 3/5/90
3 SESSUTIL.C 6-Mar-90,15:23:10,`JMH' Version as of 3/5/90
4 SESSUTIL.C 19-Jun-90,10:51:20,`JMH' Version as of 6/25/90
5 SESSUTIL.C 25-Jun-90,14:48:08,`JMH' Version as of 6/25/90
6 SESSUTIL.C 17-Sep-90,11:38:30,`JMH' Version 1.3
***revision history***
********************************************************** */
#define MAIN
#define NOCOMM
#include "windows.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "dde.h"
#include "ddelib.h"
#include "sessutil.h"
/* Undocumented windows functions */
int FAR PASCAL lstrlen (LPSTR);
LPSTR FAR PASCAL lstrcpy (LPSTR, LPSTR);
LPSTR FAR PASCAL lstrcat (LPSTR, LPSTR);
int FAR PASCAL lstrcmp (LPSTR, LPSTR);
/* Globals */
static HANDLE ghInstance;
static HWND ghWnd;
static char *gszAppName = "SessUtil";
static DDECALLBACK glpfnUser;
static FARPROC glpfnModify;
static FARPROC glpfnAbout;
static HANDLE ghSession;
static char gszUser[100];
/* Functions */
int PASCAL WinMain (HANDLE, HANDLE, LPSTR, int);
long FAR PASCAL SessutilProc (HWND, unsigned, WORD, LONG);
WORD FAR PASCAL User (HWND, unsigned, LPSTR, HANDLE);
BOOL FAR PASCAL Modify (HWND, unsigned, WORD, LONG);
void Poke (void);
BOOL FAR PASCAL About (HWND, unsigned, WORD, LONG);
int PASCAL WinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow)
HANDLE hInstance;
HANDLE hPrevInstance;
LPSTR lpCmdLine;
int nCmdShow;
{
WNDCLASS wndclass;
MSG msg;
ghInstance = hInstance;
if ( !hPrevInstance )
{
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = SessutilProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon ( hInstance, gszAppName );
wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW );
wndclass.hbrBackground = (HBRUSH) GetStockObject ( WHITE_BRUSH );
wndclass.lpszMenuName = gszAppName;
wndclass.lpszClassName = gszAppName;
if ( !RegisterClass ( &wndclass ) )
return FALSE;
} /* if ! hPrevInstance */
ghWnd = CreateWindow ( gszAppName, gszAppName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL,
hInstance, NULL );
if ( !ghWnd )
return ( NULL );
ShowWindow ( ghWnd, nCmdShow );
UpdateWindow ( ghWnd );
while ( GetMessage ( &msg, NULL, NULL, NULL ) )
{
TranslateMessage ( &msg );
DispatchMessage ( &msg );
} /* while GetMessage */
return ( msg.wParam );
} /* function WinMain */
long FAR PASCAL SessutilProc (hWnd, iMessage, wParam, lParam)
HWND hWnd;
unsigned iMessage;
WORD wParam;
LONG lParam;
{
DDEADVISE ddeAdvise;
PAINTSTRUCT ps;
switch ( iMessage )
{
case WM_CREATE:
/* Provide callback addresses for DDE callback function */
glpfnUser = (DDECALLBACK) MakeProcInstance ( (FARPROC) User,
ghInstance );
/* Inititate a DDE Session with SESSION */
if ( !( ghSession = DDEInitiate ( hWnd, "Session", "Variables" ) ) )
break;
/* Ask to be advised everytime the User variable changes */
ddeAdvise.reserved = 0xABC;
ddeAdvise.fDeferUpd = FALSE;
ddeAdvise.fAckReq = TRUE;
ddeAdvise.cfFormat = CF_TEXT;
DDEAdvise ( ghSession, "User", &ddeAdvise, glpfnUser );
break;
case WM_PAINT:
BeginPaint ( hWnd, &ps );
TextOut ( ps.hdc, 0, 0, gszUser, strlen ( gszUser ) );
EndPaint ( hWnd, &ps );
break;
case WM_COMMAND:
switch ( wParam )
{
case IDM_MODIFY:
glpfnModify = MakeProcInstance ( Modify, ghInstance );
if ( DialogBox ( ghInstance, "Modify", hWnd, glpfnModify ) )
Poke ();
FreeProcInstance ( glpfnModify );
break;
case IDM_EXIT:
SendMessage ( hWnd, WM_CLOSE, 0, 0L );
break;
case IDM_ABOUT:
glpfnAbout = MakeProcInstance ( About, ghInstance );
DialogBox ( ghInstance, "About", hWnd, glpfnAbout );
FreeProcInstance ( glpfnAbout );
break;
} /* switch wParam */
break;
case WM_DESTROY:
/* Cancel the advise circuit for User */
DDEUnadvise ( ghSession, "User" );
/* End the session with SESSION */
DDETerminate ( ghSession );
PostQuitMessage ( 0 );
break;
default:
return DefWindowProc ( hWnd, iMessage, wParam, lParam );
} /* switch iMessage */
return 0L;
} /* function SessutilProc */
/* Callback routine to notify when the User variable changes */
WORD FAR PASCAL User (hSession, iMessage, lpszItem, hData)
HWND hSession;
unsigned iMessage;
LPSTR lpszItem;
HANDLE hData;
{
LPDDEDATA lpData;
switch ( iMessage )
{
case DDE_ACK:
break;
case DDE_DATA:
/* Move data to the current user string */
lpData = (LPDDEDATA) GlobalLock ( hData );
lstrcpy ( gszUser, lpData->Value );
GlobalUnlock ( hData );
/* Force a repaint */
InvalidateRect ( ghWnd, NULL, TRUE );
break;
case DDE_TERMINATE:
break;
}
return NULL;
} /* function User */
/* Modify User variable dialog box */
BOOL FAR PASCAL Modify (hDlg, iMessage, wParam, lParam)
HWND hDlg;
unsigned iMessage;
WORD wParam;
LONG lParam;
{
switch ( iMessage )
{
case WM_INITDIALOG:
/* Initialize the value */
SetDlgItemText ( hDlg, IDD_USER, gszUser );
break;
case WM_COMMAND:
switch ( wParam )
{
case IDOK:
/* Get the new value */
GetDlgItemText ( hDlg, IDD_USER, gszUser, sizeof ( gszUser ) )
;
EndDialog ( hDlg, TRUE );
break;
case IDCANCEL:
EndDialog ( hDlg, FALSE );
break;
} /* switch wParam */
break;
default:
return FALSE;
} /* switch iMessage */
return TRUE;
} /* function Modify */
/* Modify User variable dialog box */
void Poke ()
{
HANDLE hPoke;
LPDDEPOKE lpPoke;
/* Create a poke structure */
hPoke = GlobalAlloc ( GHND | GMEM_DDESHARE, (DWORD) sizeof ( DDEPOKE ) +
strlen ( gszUser ) );
/* Fill in the poke structure */
lpPoke = (LPDDEPOKE) GlobalLock ( hPoke );
lpPoke->fRelease = TRUE;
lpPoke->cfFormat = CF_TEXT;
lstrcpy ( lpPoke->Value, gszUser );
GlobalUnlock ( hPoke );
DDEPoke ( ghSession, "User", hPoke );
} /* function Poke */
/* About box */
BOOL FAR PASCAL About (hDlg, iMessage, wParam, lParam)
HWND hDlg;
unsigned iMessage;
WORD wParam;
LONG lParam;
{
switch ( iMessage )
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
EndDialog ( hDlg, FALSE );
break;
default:
return FALSE;
} /* switch iMessage */
return TRUE;
} /* function About */